package kr.co.bettersoft.pushchat.activity;

import kr.co.bettersoft.pushchat.common.CommonConstant;
import kr.co.bettersoft.pushchat.common.PushChatRest;
import kr.co.bettersoft.pushchat.domain.PushChatMember;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.preference.CheckBoxPreference;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

public class SettingsPasswordActivity extends Activity{
	///////////////////////////////////////////////////////////////////////////////////////////////////////
	// 변수
	String TAG = "SettingsPasswordActivity";

	private final int UPDATE_PASSWORD = 101;	// 비번 변경

	String userId = "";
	String password = "";
	SharedPreferences sharedPrefCustom;	// 공용 프립스	

	String inputDataCurrentPassword;
	String inputDataNewPassword;
	String inputDataRePassword;


	// 서버 호출용
	Boolean loading = false;
	PushChatRest pushChatRest;
	String callResult = "";	// 서버 호출 결과

	// 키보드 자동 숨기기 위한 부모 레이아웃(리스너 달아서 키보드 숨김)과 입력 매니저
	View parentLayout;
	InputMethodManager imm;

	// 화면 구성
	Button top_navi_close_btn;
	Button password_change_btn;
	EditText password_current_password_txt;
	EditText password_new_password_txt;
	EditText password_re_password_txt;
	ProgressBar main_progressbar;

	///////////////////////////////////////////////////////////////////////////////////////////////////////////

	// 핸들러
	Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg){
			Bundle b = msg.getData();
			try{
				if(b.getInt("passwordChangeBtnEnable")==1){
					password_change_btn.setEnabled(true);
				}else if(b.getInt("passwordChangeBtnEnable")==2){
					password_change_btn.setEnabled(true);
				}
				if(b.getInt("showErrToast")==1){
					Toast.makeText(SettingsPasswordActivity.this,b.getString("msg"), Toast.LENGTH_SHORT).show();
				}
				if(b.getInt("showAlert")==1){					 // 경고창 . 
					//
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
						}})
						.setNegativeButton("", null).show();
				}else if(b.getInt("showAlert")==4){					 // 경고창 . 
					//
					new AlertDialog.Builder(returnThis())
					.setTitle(CommonConstant.alertTitle)							
					.setMessage(b.getString("msg"))
					.setIcon(R.drawable.ic_dialog_img)		// 경고창.  
					.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
						public void onClick(DialogInterface dialog, int whichButton) {
							// 그냥 사용자 확인 용이기 때문에 추가 조작 없음.
							finish();
						}})
						.setNegativeButton("", null).show();
				}
				if(b.getInt("order")==1){
					// 프로그래스바 실행
					main_progressbar.setVisibility(View.VISIBLE);
				}else if(b.getInt("order")==2){
					// 프로그래스바  종료
					main_progressbar.setVisibility(View.INVISIBLE);
				}

				switch (msg.what)
				{
				case UPDATE_PASSWORD : runOnUiThread(new RunnableUpdatePassword());		//	updatePassword		
				break;
				default : 
					break;
				}
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	};

	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE ); // ?
		setContentView(R.layout.settings_password_activity);

		pushChatRest = new PushChatRest();

		top_navi_close_btn = (Button) findViewById(R.id.top_navi_close_btn);			
		password_change_btn = (Button) findViewById(R.id.password_change_btn);		

		password_current_password_txt = (EditText) findViewById(R.id.password_current_password_txt);
		password_new_password_txt = (EditText) findViewById(R.id.password_new_password_txt);
		password_re_password_txt = (EditText) findViewById(R.id.password_re_password_txt);
		main_progressbar = (ProgressBar) findViewById(R.id.main_progressbar);


		// 부모 레이아웃 리스너 - 외부 터치 시 키보드 숨김 용도
		parentLayout = findViewById(R.id.parent_layout);			// 부모 레이아웃. 리스너 달아서 키보드 숨김에 사용
		parentLayout.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				Log.w(TAG,"parentLayout click");
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
				imm .hideSoftInputFromWindow(password_current_password_txt.getWindowToken(), 0);
			}
		});

		// 버튼 리스너
		top_navi_close_btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				finish();
			}
		});
		password_change_btn.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				passwordChangeBtnDisable();
				handler.sendEmptyMessage(UPDATE_PASSWORD);
			}
		});

		// 프립
		sharedPrefCustom = getSharedPreferences(CommonConstant.prefName,
				Context.MODE_WORLD_READABLE | Context.MODE_WORLD_WRITEABLE);
		userId = sharedPrefCustom.getString("userId","");
		password = sharedPrefCustom.getString("userPassword","");

	}









	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 서버 통신
	/**
	 * 러너블. 비번 변경
	 */
	class RunnableUpdatePassword implements Runnable {
		public void run(){
			new backgroundThreadUpdatePassword().execute();	
		}
	}
	/**
	 * backgroundThreadUpdatePassword
	 * 비동기  .  비번 변경 한다
	 * @author blue
	 *
	 */
	public class backgroundThreadUpdatePassword extends AsyncTask<Void, Void, Void>{
		private ProgressDialog dialog;
		@Override protected void onPostExecute(Void result) {  
			dialog.dismiss();
		} 
		@Override protected void onPreExecute() {  
			dialog = ProgressDialog.show(SettingsPasswordActivity.this, "", "Save..", true);
		} 
		@Override protected Void doInBackground(Void... params) {  
			Log.d(TAG,"backgroundThreadUpdatePassword");
			inputDataCurrentPassword = password_current_password_txt.getText()+"";
			inputDataNewPassword = password_new_password_txt.getText()+"";
			inputDataRePassword = password_re_password_txt.getText()+"";

			if(inputDataCurrentPassword.length()<1){
				// 아이디 미입력
				showResultDialog(getString(R.string.input_current_pw));			// showMsg("아이디를 입력해 주십시오.");
				loading = false;
				passwordChangeBtnEnable();
			}else if(inputDataNewPassword.length()<1){
				// 비번 미입력
				showResultDialog(getString(R.string.input_new_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
				passwordChangeBtnEnable();
			}else if(inputDataRePassword.length()<1){
				// 비번 미입력
				showResultDialog(getString(R.string.input_confirm_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
				passwordChangeBtnEnable();
			}else if(!(inputDataCurrentPassword.equals(password))){
				// 비번 미입력
				showResultDialog(getString(R.string.incorrect_current_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
				passwordChangeBtnEnable();

			}else if(!(inputDataNewPassword.equals(inputDataRePassword))){
				// 비번 미입력
				showResultDialog(getString(R.string.incorrect_new_pw));					// showMsg("비밀번호를 입력해 주십시오.");	
				loading = false;
				passwordChangeBtnEnable();
			}else{
				imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);		// 키보드 숨김
				imm .hideSoftInputFromWindow(password_current_password_txt.getWindowToken(), 0);
				password = inputDataNewPassword;
				// 파라미터 셋팅
				PushChatMember pushChatMemberParam = new PushChatMember();
				pushChatMemberParam.setMemberId(userId);
				pushChatMemberParam.setPassword(password);
				// 서버 메소드 호출
				//					showPb();
				callResult = pushChatRest.RestUpdatePassword(pushChatMemberParam);
				// 결과 처리
				if(callResult.equals("F")){
					// 실패
					showResultDialog(getString(R.string.change_pw_fail));			
					loading = false;
					passwordChangeBtnEnable();
				}else if(callResult.equals("SUCCESS")){	
					// 로그인 성공
					// pref 에 저장
					saveToPref();
					//						saveAndFinish();
					showResultDialogAndFinish(getString(R.string.change_pw_success));
				}else{
					// 실패
					showResultDialog(getString(R.string.change_pw_fail));			
					loading = false;
					passwordChangeBtnEnable();
				}
				//					hidePb();
			}
			return null; 
		}
	}

	// pref 에 변경 사항을 저장	
	public void saveToPref(){
		//			//아이디 저장하고 가기.
		SharedPreferences.Editor saveuserIdToPref = sharedPrefCustom.edit();
		saveuserIdToPref.putString("userId", userId);			// 로그인한 가맹점 아이디 저장   
		saveuserIdToPref.putString("userPassword", password);			// 로그인한 가맹점 아이디 저장   
		saveuserIdToPref.putString("autoLoginId", userId);	 		// ** 비번도 저장할 것
		saveuserIdToPref.putString("autoLoginPw", password);	 		// ** 비번도 저장할 것
		saveuserIdToPref.commit();
		//			finish();

	}

	//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// 유틸


	/**
	 * passwordChangeBtnEnable
	 * 로그인 버튼 사용 가능 하게 한다.
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void passwordChangeBtnEnable(){		
		SettingsPasswordActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("passwordChangeBtnEnable", 1);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 
	/**
	 * passwordChangeBtnDisable
	 * 로그인 버튼 사용 불가로 만든다 (두번 눌리는것 방지)
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void passwordChangeBtnDisable(){		
		SettingsPasswordActivity.this.runOnUiThread(new Runnable(){		 
			@Override
			public void run(){
				Message message = handler.obtainMessage();				
				Bundle b = new Bundle();
				b.putInt("passwordChangeBtnEnable", 2);
				message.setData(b);
				handler.sendMessage(message);
			}
		});
	} 



	public Context returnThis(){
		return this;
	}

	/**
	 * showResultDialog
	 * 토스트를 얼럿으로 바꾼다.
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showResultDialog(final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 1);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * showResultDialogAndFinish
	 * 토스트를 얼럿으로 바꾼다.
	 *
	 * @param msg
	 * @param 
	 * @return 
	 */
	public void showResultDialogAndFinish(final String msg){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();				
						Bundle b = new Bundle();
						b.putInt("showAlert", 4);
						b.putString("msg", msg);			// 화면에 보여줄 메시지
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}
	public void alertMsg(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler.obtainMessage();
						Bundle b = new Bundle();
						String alrtMsg = getString(R.string.certi_fail_msg);
						b.putInt("showErrToast", 1);
						b.putString("msg", alrtMsg);			
						message.setData(b);
						handler.sendMessage(message);
					}
				}
		).start();
	}


	// 중앙 프로그래스바 보임, 숨김
	/**
	 * showPb
	 *  중앙 프로그래스바 가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void showPb(){
		new Thread( 
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 1);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}
	/**
	 * hidePb
	 *  중앙 프로그래스바 비가시화한다
	 *
	 * @param
	 * @param
	 * @return
	 */
	public void hidePb(){
		new Thread(
				new Runnable(){
					public void run(){
						Message message = handler .obtainMessage();
						Bundle b = new Bundle();
						b.putInt( "order" , 2);
						message.setData(b);
						handler .sendMessage(message);
					}
				}
		).start();
	}

}
